using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._AviationTools._Airports._ObstructionIdentificationSurfaces
{
    /// <summary>
    /// <para>Create Curved Approach</para>
    /// <para>Creates curved approach obstacle identification surfaces (OIS) based on the supported specifications in ArcGIS Aviation. These curved approach surfaces are based on an input flight path and the information in the selected specification, for example, ICAO Annex 15, FAA 18B and classification. This tool creates surfaces in existing polygon or multipatch features.</para>
    /// <para>根据 ArcGIS Aviation 中支持的规范创建弯曲进近障碍物识别表面 （OIS）。这些弯曲的进近表面基于输入的飞行路径和所选规范中的信息，例如，国际民航组织附件15、FAA 18B和分类。此工具可在现有面或多面体要素中创建曲面。</para>
    /// </summary>    
    [DisplayName("Create Curved Approach")]
    public class CreateCurvedApproach : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public CreateCurvedApproach()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_runway_features">
        /// <para>Input Runway Features</para>
        /// <para>The input runway dataset. The feature class must be z-enabled and contain polylines.</para>
        /// <para>输入跑道数据集。要素类必须启用 z 并包含折线。</para>
        /// </param>
        /// <param name="_in_flightpath_features">
        /// <para>Input Flight Path Features</para>
        /// <para>The polyline features that define curved approaches to the specified runways.</para>
        /// <para>定义指定跑道的曲线进近的折线要素。</para>
        /// </param>
        /// <param name="_target_ois_features">
        /// <para>Target OIS Features</para>
        /// <para>The target feature class that will contain the generated OIS.</para>
        /// <para>将包含生成的 OIS 的目标要素类。</para>
        /// </param>
        /// <param name="_specification">
        /// <para>Specification</para>
        /// <para><xdoc>
        ///   <para>Specifies the approach surface specification.</para>
        ///   <bulletList>
        ///     <bullet_item>ICAO Annex 15—ICAO Annex 15 (ETOD)</bullet_item><para/>
        ///     <bullet_item>ICAO Annex 14—ICAO Annex 14 (OLS)</bullet_item><para/>
        ///     <bullet_item>FAA regulations part 77—FAA regulations part 77 (FAR77)</bullet_item><para/>
        ///     <bullet_item>FAA Advisory circular 150/5300_18B—FAA Advisory circular 150/5300_18B (18B)</bullet_item><para/>
        ///     <bullet_item>FAA Advisory circular 150/5300_13A—FAA Advisory circular 150/5300_13A (13A)</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定进近曲面规范。</para>
        ///   <bulletList>
        ///     <bullet_item>国际民航组织附件15—国际民航组织附件15（ETOD）</bullet_item><para/>
        ///     <bullet_item>国际民航组织附件14—国际民航组织附件14（OLS）</bullet_item><para/>
        ///     <bullet_item>FAA 法规第 77 部分 — FAA 法规第 77 部分 （FAR77）</bullet_item><para/>
        ///     <bullet_item>FAA 咨询通告 150/5300_18B—FAA 咨询通告 150/5300_18B （18B）</bullet_item><para/>
        ///     <bullet_item>FAA 咨询通告 150/5300_13A—FAA 咨询通告 150/5300_13A （13A）</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// </param>
        /// <param name="_runway_classification">
        /// <para>Runway Classification</para>
        /// <para><xdoc>
        ///   <para>The runway classification of the approach surface.</para>
        ///   <para>The option used for the Specification parameter (specification in Python) will determine the available options for the this parameter.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>进近面的跑道分类。</para>
        ///   <para>用于 Specification 参数（Python 中的 specification）的选项将确定此参数的可用选项。</para>
        /// </xdoc></para>
        /// </param>
        public CreateCurvedApproach(object _in_runway_features, object _in_flightpath_features, object _target_ois_features, _specification_value? _specification, object _runway_classification)
        {
            this._in_runway_features = _in_runway_features;
            this._in_flightpath_features = _in_flightpath_features;
            this._target_ois_features = _target_ois_features;
            this._specification = _specification;
            this._runway_classification = _runway_classification;
        }
        public override string ToolboxName => "Aviation Tools";

        public override string ToolName => "Create Curved Approach";

        public override string CallName => "aviation.CreateCurvedApproach";

        public override List<string> AcceptEnvironments => ["workspace"];

        public override object[] ParameterInfo => [_in_runway_features, _in_flightpath_features, _target_ois_features, _specification.GetGPValue(), _runway_classification, _out_ois_features, _custom_json_file, _threshold_offset];

        /// <summary>
        /// <para>Input Runway Features</para>
        /// <para>The input runway dataset. The feature class must be z-enabled and contain polylines.</para>
        /// <para>输入跑道数据集。要素类必须启用 z 并包含折线。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Runway Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_runway_features { get; set; }


        /// <summary>
        /// <para>Input Flight Path Features</para>
        /// <para>The polyline features that define curved approaches to the specified runways.</para>
        /// <para>定义指定跑道的曲线进近的折线要素。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Flight Path Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_flightpath_features { get; set; }


        /// <summary>
        /// <para>Target OIS Features</para>
        /// <para>The target feature class that will contain the generated OIS.</para>
        /// <para>将包含生成的 OIS 的目标要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Target OIS Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _target_ois_features { get; set; }


        /// <summary>
        /// <para>Specification</para>
        /// <para><xdoc>
        ///   <para>Specifies the approach surface specification.</para>
        ///   <bulletList>
        ///     <bullet_item>ICAO Annex 15—ICAO Annex 15 (ETOD)</bullet_item><para/>
        ///     <bullet_item>ICAO Annex 14—ICAO Annex 14 (OLS)</bullet_item><para/>
        ///     <bullet_item>FAA regulations part 77—FAA regulations part 77 (FAR77)</bullet_item><para/>
        ///     <bullet_item>FAA Advisory circular 150/5300_18B—FAA Advisory circular 150/5300_18B (18B)</bullet_item><para/>
        ///     <bullet_item>FAA Advisory circular 150/5300_13A—FAA Advisory circular 150/5300_13A (13A)</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定进近曲面规范。</para>
        ///   <bulletList>
        ///     <bullet_item>国际民航组织附件15—国际民航组织附件15（ETOD）</bullet_item><para/>
        ///     <bullet_item>国际民航组织附件14—国际民航组织附件14（OLS）</bullet_item><para/>
        ///     <bullet_item>FAA 法规第 77 部分 — FAA 法规第 77 部分 （FAR77）</bullet_item><para/>
        ///     <bullet_item>FAA 咨询通告 150/5300_18B—FAA 咨询通告 150/5300_18B （18B）</bullet_item><para/>
        ///     <bullet_item>FAA 咨询通告 150/5300_13A—FAA 咨询通告 150/5300_13A （13A）</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Specification")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public _specification_value? _specification { get; set; }

        public enum _specification_value
        {
            /// <summary>
            /// <para>ICAO Annex 15</para>
            /// <para>ICAO Annex 15—ICAO Annex 15 (ETOD)</para>
            /// <para>国际民航组织附件15—国际民航组织附件15（ETOD）</para>
            /// </summary>
            [Description("ICAO Annex 15")]
            [GPEnumValue("ETOD")]
            _ETOD,

            /// <summary>
            /// <para>ICAO Annex 14</para>
            /// <para>ICAO Annex 14—ICAO Annex 14 (OLS)</para>
            /// <para>国际民航组织附件14—国际民航组织附件14（OLS）</para>
            /// </summary>
            [Description("ICAO Annex 14")]
            [GPEnumValue("OLS")]
            _OLS,

            /// <summary>
            /// <para>FAA regulations part 77</para>
            /// <para>FAA regulations part 77—FAA regulations part 77 (FAR77)</para>
            /// <para>FAA 法规第 77 部分 — FAA 法规第 77 部分 （FAR77）</para>
            /// </summary>
            [Description("FAA regulations part 77")]
            [GPEnumValue("FAR77")]
            _FAR77,

            /// <summary>
            /// <para>FAA Advisory circular 150/5300_18B</para>
            /// <para>FAA Advisory circular 150/5300_18B—FAA Advisory circular 150/5300_18B (18B)</para>
            /// <para>FAA 咨询通告 150/5300_18B—FAA 咨询通告 150/5300_18B （18B）</para>
            /// </summary>
            [Description("FAA Advisory circular 150/5300_18B")]
            [GPEnumValue("18B")]
            _18B,

            /// <summary>
            /// <para>FAA Advisory circular 150/5300_13A</para>
            /// <para>FAA Advisory circular 150/5300_13A—FAA Advisory circular 150/5300_13A (13A)</para>
            /// <para>FAA 咨询通告 150/5300_13A—FAA 咨询通告 150/5300_13A （13A）</para>
            /// </summary>
            [Description("FAA Advisory circular 150/5300_13A")]
            [GPEnumValue("13A")]
            _13A,

        }

        /// <summary>
        /// <para>Runway Classification</para>
        /// <para><xdoc>
        ///   <para>The runway classification of the approach surface.</para>
        ///   <para>The option used for the Specification parameter (specification in Python) will determine the available options for the this parameter.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>进近面的跑道分类。</para>
        ///   <para>用于 Specification 参数（Python 中的 specification）的选项将确定此参数的可用选项。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Runway Classification")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _runway_classification { get; set; }


        /// <summary>
        /// <para>Output OIS Features</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output OIS Features")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public object _out_ois_features { get; set; }


        /// <summary>
        /// <para>Custom JSON File</para>
        /// <para>The import configuration, in JSON format, that creates the custom OIS.</para>
        /// <para>用于创建自定义 OIS 的 JSON 格式的导入配置。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Custom JSON File")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _custom_json_file { get; set; } = null;


        /// <summary>
        /// <para>Threshold Offset</para>
        /// <para>The distance offset from the runway end point. The threshold will be applied in the units of the input.</para>
        /// <para>距跑道终点的距离偏移。阈值将以输入的单位应用。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Threshold Offset")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _threshold_offset { get; set; } = 0;


        public CreateCurvedApproach SetEnv(object workspace = null)
        {
            base.SetEnv(workspace: workspace);
            return this;
        }

    }

}